import re
import json
from datetime import datetime

# 解析SQL文件，提取表结构信息
def parse_sql_file(file_path):
    tables = []
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
        
        # 提取所有表定义块
        table_blocks = re.findall(r'-- ----------------------------\s+-- Table structure for ([\w_]+)\s+-- ----------------------------\s+DROP TABLE IF EXISTS `[^`]+`;\s+CREATE TABLE `([^`]+)`\s+\(([^;]+)\)([^;]+);', content, re.DOTALL)
        
        for block in table_blocks:
            table_name = block[1]
            table_content = block[2]
            table_options = block[3]
            
            # 提取表注释
            table_comment = ''
            comment_match = re.search(r'COMMENT\s*=\s*["\']([^"\']+)', table_content + table_options)
            if comment_match:
                table_comment = comment_match.group(1)
            
            # 提取主键
            primary_key = None
            pk_match = re.search(r'PRIMARY KEY\s+\(([^)]+)\)', table_content)
            if pk_match:
                # 提取主键字段名（处理复合主键情况）
                pk_fields = re.findall(r'`([^`]+)`', pk_match.group(1))
                if pk_fields:
                    primary_key = pk_fields[0]  # 只取第一个作为主键
            
            # 提取列信息
            columns = []
            # 按行分割表内容
            lines = table_content.split('\n')
            for line in lines:
                line = line.strip()
                # 跳过空行、主键定义行和索引定义行
                if not line or line.startswith('PRIMARY KEY') or line.startswith('KEY'):
                    continue
                
                # 匹配列定义
                col_match = re.search(r'`([^`]+)`\s+([^\s,]+)([^,]*)(?:COMMENT\s+["\']([^"\']+)["\'])?', line)
                if col_match:
                    col_name = col_match.group(1)
                    col_type = col_match.group(2)
                    col_definition = col_match.group(3)
                    col_comment = col_match.group(4) if col_match.group(4) else ''
                    
                    # 提取默认值
                    default_value = ''
                    default_match = re.search(r'DEFAULT\s+([^\s,]+)', col_definition)
                    if default_match:
                        default_value = default_match.group(1)
                    
                    # 如果comment为空，尝试从列定义中提取
                    if not col_comment:
                        comment_match = re.search(r'COMMENT\s+["\']([^"\']+)', col_definition)
                        if comment_match:
                            col_comment = comment_match.group(1)
                    
                    columns.append({
                        'name': col_name,
                        'type': col_type,
                        'default': default_value,
                        'comment': col_comment,
                        'is_primary': col_name == primary_key
                    })
            
            tables.append({
                'name': table_name,
                'comment': table_comment,
                'columns': columns
            })
    
    return tables

# 生成数据库设计文档
def generate_db_doc(tables, db_name='ims_base'):
    doc = f"""
# {db_name} 数据库设计文档

## 1. 项目概述

**项目名称**：云小店系统
**数据库名称**：{db_name}
**生成时间**：{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
**数据库类型**：MySQL

## 2. 数据库表结构

"""
    
    # 按功能模块分类表（根据表名前缀）
    modules = {}
    for table in tables:
        prefix = table['name'].split('_')[0]
        if prefix not in modules:
            modules[prefix] = []
        modules[prefix].append(table)
    
    table_global_index = 1
    # 生成每个模块的表信息
    for module_name, module_tables in modules.items():
        # 去掉模块标题，直接生成表信息
        for table in module_tables:
            doc += f"""
### 2.{table_global_index} `{table['name']}` - {table['comment']}

| 字段名 | 数据类型 | 默认值 | 说明 | 主键 |
| :--- | :--- | :--- | :--- | :--- |
"""
            
            for col in table['columns']:
                # 确保主键对号只显示在主键列中
                primary_mark = '√' if col['is_primary'] else ''
                doc += f"| {col['name']} | {col['type']} | {col['default']} | {col['comment']} | {primary_mark} |\n"
            
            doc += "\n"  # 添加空行
            table_global_index += 1
    
    return doc

import sys

# 主函数
def main():
    # 支持命令行参数，默认使用ims_base.sql
    sql_file = sys.argv[1] if len(sys.argv) > 1 else 'ims_base.sql'
    
    # 根据SQL文件名生成输出文件名，并添加时间戳
    db_name = sql_file.split('.')[0]
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    md_file = f'{db_name}_设计文档_{timestamp}.md'
    
    try:
        print(f"正在解析SQL文件: {sql_file}...")
        tables = parse_sql_file(sql_file)
        print(f"成功解析 {len(tables)} 个表")
        
        # 统计总字段数量
        total_columns = sum(len(table['columns']) for table in tables)
        print(f"总字段数量: {total_columns}")
        
        print("正在生成数据库设计文档...")
        doc_content = generate_db_doc(tables, db_name)
        
        # 保存为Markdown文件
        with open(md_file, 'w', encoding='utf-8') as f:
            f.write(doc_content)
        print(f"数据库设计文档已保存为: {md_file}")
        
        # 提示用户需要转换为DOC格式
        print("\n请将Markdown文件转换为DOC格式。可以使用以下方法：")
        print("1. 使用Typora等支持导出为DOC的Markdown编辑器")
        print("2. 使用在线转换工具")
        print("3. 复制到Word文档中")
        
        return tables, total_columns
        
    except Exception as e:
        print(f"发生错误: {e}")
        return None, 0

if __name__ == "__main__":
    main()